﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace Formation_Entreprise
{
    public partial class frmCreationEntreprise : Form
    {
        // Initialisation des images pour notification de la
        // validité de la valeur des champs
        Bitmap bitCheckMark = new Bitmap("../../image/checkmark.png");
        Bitmap bitXMark = new Bitmap("../../image/xmark.png");

        public frmCreationEntreprise()
        {
            //***********************************************//
            // Gestion de base de l'apparence du formulaire
            // (frmCreationClient) et de ces contrôles divers.    
            //***********************************************//

            InitializeComponent();

            // Ajustement du "SizeMode" de tout les controles PictureBox 
            // dans le formulaire frmCreationClient
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl is PictureBox)
                {
                    try
                    {
                        PictureBox pb = (PictureBox)ctrl;
                        pb.SizeMode = PictureBoxSizeMode.StretchImage;
                    }
                    catch (InvalidCastException CastEx)
                    {
                        // On attrape l'erreur si le "casting" en type PictureBox
                        // ne fonctionne pas et nous l'ignorons.
                        
                        // N.B. Il est impossible de looper toute les PictureBox d'un
                        // formulaire, car les formulaires n'ont pas la propriété GetEnumarator
                        // ils ne peuvent donc pas etre utiliser dans une boucle
                    }
                }
            }

            // Il est impossible d'entrer des données dans cette boite de texte
            this.txtRepertoire.ReadOnly = true;

            // Modification des TabIndex des multiple contrôle du formulaire
            #region TABINDEX
            this.txtEntreprise.TabIndex = 1;
            this.txtContact.TabIndex = 2;
            this.txtTelephone.TabIndex = 3;
            this.txtCodePostal.TabIndex = 4;
            this.txtAdresse.TabIndex = 5;
            this.txtVille.TabIndex = 6;
            this.txtActivite.TabIndex = 7;
            this.txtCourriel.TabIndex = 8;
            this.btnBrowse.TabIndex = 9;
            this.cbConseiller.TabIndex = 10;
            #endregion 
        }

        private void frmCreationEntreprise_Load(object sender, EventArgs e)
        {
            // Population du Combo Box Conseiller
            for (int i = 0; i < AccesTableConseiller.ListerConseillersActif().Count; i++)
                this.cbConseiller.Items.Add(AccesTableConseiller.ListerConseillersActif()[i].Nom);
        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {
            // AFFICHAGE d'un FolderBrowserDialog afin de selectionner
            // le fichier a associer à une nouvelle entreprise.
            FolderBrowserDialog fbdPathClient = new FolderBrowserDialog();
            DialogResult reponse = fbdPathClient.ShowDialog();

            // SI l'utilisateur confirme le fichier avec FolderBrowserDialog
            // on inscrit le chemin d'acces dans la boite de texte approprié.
            if (reponse == DialogResult.OK)
                txtRepertoire.Text = fbdPathClient.SelectedPath;
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            // APPEL de la fonction pour vérifier si les champs du formulaire
            // sont vide
            if (ProperlyFilledForm() && this.cbConseiller.Text != string.Empty)
            {
                // Obtention des valeurs du formulaire, on les stockent dans des variables.
                string entreprise = this.txtEntreprise.Text;
                string contact = this.txtContact.Text;
                string telephone = String.Format("({0}) {1}-{2}", 
                    this.txtTelephone.Text.Substring(0, 3), 
                    this.txtTelephone.Text.Substring(3, 3), 
                    this.txtTelephone.Text.Substring(6));
                string codePostal = this.txtCodePostal.Text;
                string adresse = this.txtAdresse.Text;
                string ville = this.txtVille.Text;
                string secteurActivite = this.txtActivite.Text;
                string courriel = this.txtCourriel.Text;
                string path = this.txtRepertoire.Text;
                int conseiller = AccesTableConseiller.ObtenirNumeroConseiller(this.cbConseiller.SelectedItem.ToString());
                // AJOUT de l'entreprise dans la base de données
                objEntreprise addEntreprise = new objEntreprise(entreprise, contact, telephone, codePostal, 
                    adresse, ville, secteurActivite, courriel, path, conseiller, null);
                int succes = AccesTableEntreprise.AjouterEntreprise(addEntreprise);
                if (succes > 0)
                {
                    // Fermeture du formulaire, les actions on tous été complété avec succès
                    MessageBox.Show("Ajout de l'entreprise " + entreprise + " avec succès");           
                    this.Close();
                }
                else
                    MessageBox.Show("Une erreur s'est produite, veuillez réessayer");
            }
            else
            { 
                // AFFICHAGE d'un message pour signaler que le formulaire n'est pas 
                // remplit correctement.
                MessageBox.Show("Veuillez remplir le formulaire correctement");
            }               
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            DialogResult dlgResult = MessageBox.Show("Voulez-vous vraiment vous annuler?", "Annuler", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dlgResult == DialogResult.Yes)
            {
                // Fermeture du formulaire
                this.Close();
            }
        }

        private void txtTelephone_Leave(object sender, EventArgs e)
        {
            // Condition du format d'entré pour le numéro de téléphone
            Match matchPhone = Regex.Match(txtTelephone.Text, @"^[0-9]{10}$");

            // Gestion de l'image afficher afin d'informer le client
            // de la validité de l'information entré dans le contrôle
            if (matchPhone.Success)
                this.picTelephone.Image = this.bitCheckMark;
            else
                this.picTelephone.Image = this.bitXMark;
        }

        private void txtCodePostal_Leave(object sender, EventArgs e)
        {
            // Conversion des caractères en majuscule afin de réguler les 
            // items qui entre dans la base de données.
            this.txtCodePostal.Text = this.txtCodePostal.Text.ToUpper();

            // Condition du format d'entré pour le code postal
            Match matchPostal = Regex.Match(txtCodePostal.Text,
                @"^[ABCEGHJKLMNPRSTVXY]\d[A-Z]\ {0,1}\d[A-Z]\d$");

            // Gestion de l'image afficher afin d'informer le client
            // de la validité de l'information entré dans le contrôle
            if (matchPostal.Success)
                this.picCodePostal.Image = this.bitCheckMark;
            else
                this.picCodePostal.Image = this.bitXMark;
        }

        private void txtCourriel_Leave(object sender, EventArgs e)
        {          
            // Condition du format d'entré pour le courriel
            Match matchCourriel = Regex.Match(txtCourriel.Text,
                @"^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-z]{2,4}$");

            // Gestion de l'image afficher afin d'informer le client
            // de la validité de l'information entré dans le contrôle
            if (matchCourriel.Success)
            {
                this.picCourriel.Image = this.bitCheckMark;
            }
            else
                this.picCourriel.Image = this.bitXMark;
        }

        // Methode ayant pour but de vérifier si la textbox donnée est vide
        private bool CheckForEmptyControl(TextBox textbox)
        {
            if (textbox.Text == string.Empty)
                return false;
            else
                return true;
        }

        // Methode ayant pour but de vérifier si la textbox donnée est vide et 
        // de modifier la picturebox qui lui est associer
        private bool CheckForEmptyControl(TextBox textbox, PictureBox picturebox)
        {
            if (textbox.Text == string.Empty)
            {
                picturebox.Image = this.bitXMark;
                return false;
            }
            else
            {
                picturebox.Image = null;
                return true;
            }
        }

        // Methode pour but de vérifier si le formulaire est remplit correctement
        private bool ProperlyFilledForm() 
        {
            // Création du tableau qui va contenir le resultat de l'analyse des 
            // contrôles
            bool[] arrControlState = new bool[6];

            // Stockage des données de l'analyse des controles grace a la methode CheckForEmptyControl
            arrControlState[0] = this.CheckForEmptyControl(txtEntreprise, picEntreprise);
            arrControlState[1] = this.CheckForEmptyControl(txtContact, picContact);
            arrControlState[2] = this.CheckForEmptyControl(txtAdresse, picAdresse);
            arrControlState[3] = this.CheckForEmptyControl(txtVille, picVille);
            arrControlState[4] = this.CheckForEmptyControl(txtActivite, picActivite);
            arrControlState[5] = this.CheckForEmptyControl(txtRepertoire);

            // Verification afin de retourner si les controles vérifier
            // sont tous remplient correctement
            if (arrControlState.Contains(false))
                return false;
            else
                return true;
        }
    }
}
